package com.shelpe.services.sinbad.service.simbaproxy;

import java.util.Date;
import java.util.List;

import org.springframework.beans.BeanUtils;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonFormat.Shape;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.shelpe.services.sinbad.service.simbaproxy.SimbaProxyClient.SimbaProxyClientFallback;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import rx.Observable;

@FeignClient(name="${feign.simba.name}", url="${feign.simba.url}", fallback = SimbaProxyClientFallback.class)
public interface SimbaProxyClient {
	
	/**
	 * 设置一批关键词的出价
	 * @param nick
	 * @param jsonString
	 * @return
	 */
	@RequestMapping(method = RequestMethod.GET, value = "/simba/taobao.simba.keywords.pricevon.set")
	public Observable<PriceKeywordsResponse> updateKeywords(@RequestParam("nick")String nick, @RequestParam("keywordid_prices")String jsonString);
	
	@Data
	public static class PriceKeywordsResponse extends SimbaProxyBaseDto{
		@JsonProperty("simba_keywords_pricevon_set_response")
		private PriceKeywordsRes res;
	}
	
	@Data
	public static class PriceKeywordsRes{
		@JsonProperty("keywords")
		private PriceKeywordsDataList dataList;
	}
	
	@Data
	public static class PriceKeywordsDataList{
		@JsonProperty("keyword")
		private List<Keyword> keywords;
	}
	
	/**
	 * 创建一批关键词
	 * @return
	 */
	@RequestMapping(method = RequestMethod.GET, value = "/simba/taobao.simba.keywordsvon.add")
	public Observable<AddKeywordsResponse> createKeywords(@RequestParam("nick") String nick, @RequestParam("adgroup_id") long adgroupId, 
			@RequestParam("keyword_prices") String keywordPrices);
	
	@Data
	public static class AddKeywordsResponse extends SimbaProxyBaseDto{
		@JsonProperty("simba_keywordsvon_add_response")
		private AddKeywordsRes res;
	}
	
	@Data
	public static class AddKeywordsRes{
		@JsonProperty("keywords")
		private AddKeywordsDataList dataList;
	}
	
	@Data
	public static class AddKeywordsDataList{
		@JsonProperty("keyword")
		private List<Keyword> keywords;
	}
	
	@RequestMapping(method = RequestMethod.GET, value = "/simba/taobao.simba.keywords.delete")
	public Observable<DeleteKeywordsResponse> removeKeywords(@RequestParam("nick") String nick, @RequestParam("campaign_id") long campaignId, 
			@RequestParam("keyword_ids") List<Long> keywordIds);
	@Data
	public static class DeleteKeywordsResponse extends SimbaProxyBaseDto{
		@JsonProperty("simba_keywords_delete_response")
		private DeleteKeywordsRes res;
	}
	
	@Data
	public static class DeleteKeywordsRes{
		@JsonProperty("keywords")
		private DeleteKeywordsDataList dataList;
	}
	
	@Data
	public static class DeleteKeywordsDataList{
		@JsonProperty("keyword")
		private List<Keyword> keywords;
	}
	
	@Data
	public static class HandlingKeyword {
		@JsonProperty("keywordId")
		private long keywordID;
		
		private int matchScope;
		private int maxPrice;//价格，是整数，以“分”为单位，不能小于5，不能大于日限额,也不能大于99.99元,当使用默认出价时必须将这个值设置为0。
		private int isDefaultPrice;//是否使用默认出价，只能是0，1(0代表不使用，1代表使用)
		private int maxMobilePrice;//只能是1,2,4（1代表精确匹配，4代表广泛匹配）
		private int mobileIsDefaultPrice;//无线出价是否采用pc*无线溢价，还是独立价格（1：是；0：否）
	}
	
	@Data
	public static class AddingKeyword {
		private String word;
		private int matchScope;
		private int maxPrice;//价格，是整数，以“分”为单位，不能小于5，不能大于日限额,也不能大于99.99元,当使用默认出价时必须将这个值设置为0。
		private int isDefaultPrice;//是否使用默认出价，只能是0，1(0代表不使用，1代表使用)
	}
	
	@Data
	public static class Keyword {
		@JsonProperty("keyword_id")
		private long keywordId;
		@JsonProperty("campaign_id")
		private long campaignId;
		@JsonProperty("adgroup_id")
		private long adgroupId;
		
		private String word;
		private int qscore;
		@JsonProperty("match_scope")
		private int matchscope;
		@JsonProperty("max_price")
		private int maxPrice;//价格，是整数，以“分”为单位，不能小于5，不能大于日限额,也不能大于99.99元,当使用默认出价时必须将这个值设置为0。
		@JsonProperty("is_default_price")
		private boolean isDefaultPrice;//是否使用默认出价
		@JsonProperty("max_mobile_price")
		private int maxMobilePrice;//只能是1,2,4（1代表精确匹配，4代表广泛匹配）
		@JsonProperty("mobile_is_default_price")
		private int mobileIsDefaultPrice;//无线出价是否采用pc*无线溢价，还是独立价格
		
		@JsonProperty("audit_status")
		private String auditStatus;
		@JsonProperty("audit_desc")
		private String auditDesc;
		@JsonProperty("is_garbage")
		private boolean isGarbage;
		
		@JsonProperty("create_time")
		@JsonFormat(shape=Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
		private Date createTime;
		@JsonProperty("modified_time")
		@JsonFormat(shape=Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
		private Date modifiedTime;
		
		public com.shelpe.services.sinbad.model.Keyword toPO(com.shelpe.services.sinbad.model.Keyword kw){
			BeanUtils.copyProperties(this, kw);
			kw.setAdgroupId(this.adgroupId);
			kw.setCampaignId(this.campaignId);
			kw.setIsGarbage(this.isGarbage);
			kw.setKeywordId(this.keywordId);
			kw.setMatchscope(this.matchscope);
			kw.setMaxMobilePrice(this.maxMobilePrice);
			kw.setMobileIsDefaultPrice(this.mobileIsDefaultPrice);
			kw.setMaxPrice(this.maxPrice);
			kw.setIsDefaultPrice(this.isDefaultPrice);
			return kw;
		}
	}
	
	@Service
	@Slf4j
	public static class SimbaProxyClientFallback implements SimbaProxyClient{

		@Override
		public Observable<PriceKeywordsResponse> updateKeywords(String nick, String jsonString) {
			log.error("fallback priceKeywords: {}", jsonString);
			return Observable.just(new PriceKeywordsResponse());
		}

		@Override
		public Observable<AddKeywordsResponse> createKeywords(String nick, long adgroupId, String keywordPrices) {
			log.error("fallback addKeywords: {}", keywordPrices);
			return Observable.just(new AddKeywordsResponse());
		}

		@Override
		public Observable<DeleteKeywordsResponse> removeKeywords(String nick, long campaignId, List<Long> keywordIds) {
			log.error("fallback deleteKeywords: {}", keywordIds!=null?keywordIds:"null");
			return Observable.just(new DeleteKeywordsResponse());
		}
		
	}
}